#include "bsp_gpio.h"

/*******************************************************************
* 函数名: bsp_gpio_init()
* 功 能: 
* 输 入: 
* 输 出: 
*******************************************************************/
void bsp_gpio_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_GPIOC);
    rcu_periph_clock_enable(RCU_GPIOD);
	// ADDR0~7
    gpio_mode_set(ADDR0_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ADDR0_PIN);
    gpio_mode_set(ADDR1_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ADDR1_PIN);
    gpio_mode_set(ADDR2_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ADDR2_PIN);
    gpio_mode_set(ADDR3_GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, ADDR3_PIN);

	// LED1
    gpio_mode_set(LED1_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED1_PIN);
    gpio_output_options_set(LED1_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED1_PIN);
    gpio_bit_set(LED1_GPIO_PORT, LED1_PIN);
	// 红
    gpio_mode_set(LED_RED_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_RED_PIN);
    gpio_output_options_set(LED_RED_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_RED_PIN);
    gpio_bit_set(LED_RED_GPIO_PORT, LED_RED_PIN);
	// 绿
    gpio_mode_set(LED_GREEN_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_GREEN_PIN);
    gpio_output_options_set(LED_GREEN_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LED_GREEN_PIN);
    gpio_bit_set(LED_GREEN_GPIO_PORT, LED_GREEN_PIN);

	/* 语音控制 */
    //gpio_mode_set(VOICE_K1_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, VOICE_K1_PIN);
    //gpio_output_options_set(VOICE_K1_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, VOICE_K1_PIN);
    //gpio_bit_set(VOICE_K1_GPIO_PORT, VOICE_K1_PIN);

    gpio_mode_set(VOICE_K2_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, VOICE_K2_PIN);
    gpio_output_options_set(VOICE_K2_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, VOICE_K2_PIN);
    gpio_bit_reset(VOICE_K2_GPIO_PORT, VOICE_K2_PIN); // 收线已停止

    gpio_mode_set(VOICE_K3_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, VOICE_K3_PIN);
    gpio_output_options_set(VOICE_K3_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, VOICE_K3_PIN);
    gpio_bit_reset(VOICE_K3_GPIO_PORT, VOICE_K3_PIN); // 请求换盘中

    gpio_mode_set(VOICE_K4_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, VOICE_K4_PIN);
    gpio_output_options_set(VOICE_K4_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, VOICE_K4_PIN);
    gpio_bit_reset(VOICE_K4_GPIO_PORT, VOICE_K4_PIN); // 收线停止

    gpio_mode_set(VOICE_K5_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, VOICE_K5_PIN);
    gpio_output_options_set(VOICE_K5_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, VOICE_K5_PIN);
    gpio_bit_reset(VOICE_K5_GPIO_PORT, VOICE_K5_PIN); // 允许换盘

    gpio_mode_set(VOICE_K6_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, VOICE_K6_PIN);
    gpio_output_options_set(VOICE_K6_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, VOICE_K6_PIN);
    gpio_bit_reset(VOICE_K6_GPIO_PORT, VOICE_K6_PIN); // 请求换盘

	// lora
    gpio_mode_set(LORA_M0_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LORA_M0_PIN);
    gpio_output_options_set(LORA_M0_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LORA_M0_PIN);
    gpio_bit_set(LORA_M0_PORT, LORA_M0_PIN);

    gpio_mode_set(LORA_M1_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LORA_M1_PIN);
    gpio_output_options_set(LORA_M1_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, LORA_M1_PIN);
    gpio_bit_set(LORA_M1_PORT, LORA_M1_PIN);

	gpio_mode_set(LORA_AUX_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, LORA_AUX_PIN);

	//POWER
    gpio_mode_set(CTRL_POWER_3V3_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, CTRL_POWER_3V3_PIN);
    gpio_output_options_set(CTRL_POWER_3V3_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, CTRL_POWER_3V3_PIN);
    gpio_bit_set(CTRL_POWER_3V3_PORT, CTRL_POWER_3V3_PIN);

    gpio_mode_set(HORN_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, HORN_PIN);
    gpio_output_options_set(HORN_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, HORN_PIN);
    gpio_bit_set(HORN_GPIO_PORT, HORN_PIN);
}

/*******************************************************************
* 函数名: bsp_gpio_led_toggle()
* 功 能: 反转LED灯
* 输 入: led id号 
*     
* 输 出: 
*******************************************************************/
void bsp_gpio_led_toggle(uint8_t led_id)
{
	if(led_id == 0)
	{
		FlagStatus state_last = gpio_input_bit_get(LED_RED_GPIO_PORT, LED_RED_PIN);
		gpio_bit_write(LED_RED_GPIO_PORT, LED_RED_PIN, (bit_status)(1 - state_last));		
	}
	else if(led_id == 1)
	{
		FlagStatus state_last = gpio_input_bit_get(LED_GREEN_GPIO_PORT, LED_GREEN_PIN);
		gpio_bit_write(LED_GREEN_GPIO_PORT, LED_GREEN_PIN, (bit_status)(1 - state_last));	
	}
}

/*******************************************************************
* 函数名: bsp_gpio_read_adrr()
* 功 能: 读设备地址
* 输 入: 
* 输 出: 
*******************************************************************/
uint8_t bsp_gpio_read_adrr(void)
{
	bsp_gpio_addr_t addr_id;

	addr_id.addr_0 = gpio_input_bit_get(ADDR0_GPIO_PORT, ADDR0_PIN);
	addr_id.addr_1 = gpio_input_bit_get(ADDR1_GPIO_PORT, ADDR1_PIN);
	addr_id.addr_2 = gpio_input_bit_get(ADDR2_GPIO_PORT, ADDR2_PIN);
	addr_id.addr_3 = gpio_input_bit_get(ADDR3_GPIO_PORT, ADDR3_PIN);
	addr_id.addr_4 = 0;
	addr_id.addr_5 = 0;
	addr_id.addr_6 = 0;
	addr_id.addr_7 = 0;

	return addr_id.addr;
}
